package cn.kgc.common.advice;


import cn.hutool.json.JSONUtil;
import cn.kgc.common.vo.Result;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.lang.reflect.Method;

/**
 * @author kgc
 * 控制器结果增强
 */
@ControllerAdvice("cn.kgc.api.controller")
public class ResultAdvice implements ResponseBodyAdvice<Object>{
    /**
     * 如果supports方法的返回值是true,就会执行beforeBodyWrite方法。
     * @param methodParameter  目标方法参数
     * @param aClass 类型
     * @return 是否支持
     */
    @Override
    public boolean supports(MethodParameter methodParameter,
                            Class<? extends HttpMessageConverter<?>> aClass) {
        //获得方法的信息
        Method method = methodParameter.getMethod();
        //判断方法上是否有IgnoreResult注解
        if(method.isAnnotationPresent(IgnoreResult.class)){
            //如果方法上使用了IgnoreResult注解,则不进行封装
            return false;
        }
        return true;
    }

    /**
     * 将控制器方法的返回值封装到Result对象中
     * @param o  控制器中方法的返回值
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if(o==null){
            return Result.success();
        }else if(o instanceof Result){
            return o;
        }else if (o instanceof  String){
            return JSONUtil.toJsonStr(Result.success(o));
        }else{
           return Result.success(o);
        }
    }
}